home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Info-Mac 4
/
Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso
/
Development
/
General
/
DR1.#1 PPC C⁄C++ ƒ
/
C++ Runtime ƒ
/
ptmf.s
< prev
next >
Wrap
Text File
|
1994-01-22
|
6KB
|
199 lines
# ptmf.s - pointer-to-member-function support for Metrowerks C++ for PowerPC
#
# Copyright © 1993 metrowerks inc. All Rights Reserved.
#
#
# THEORY OF OPERATION
#
# A pointer-to-member-function (PTMF) is represented as a 3-word struct:
#
# +-----------------------------+ +-----------------------------+
# | 'this' delta | | 'this' delta |
# |-----------------------------| |-----------------------------|
# | -1 | | vtbl index |
# |-----------------------------| |-----------------------------|
# | function pointer | | vptr offset |
# +-----------------------------+ +-----------------------------+
#
#
# Assembler Equates
#
.set r0,0; .set SP,1; .set RTOC,2; .set r3,3; .set r4,4; .set r5,5; .set r6,6; .set r7,7
.set r8,8; .set r9,9; .set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14; .set r15,15
.set r16,16; .set r17,17; .set r18,18; .set r19,19; .set r20,20; .set r21,21; .set r22,22; .set r23,23
.set r24,24; .set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29; .set r30,30; .set r31,31
.set fp0,0; .set fp1,1; .set fp2,2; .set fp3,3; .set fp4,4; .set fp5,5; .set fp6,6; .set fp7,7
.set fp8,8; .set fp9,9; .set fp10,10; .set fp11,11; .set fp12,12; .set fp13,13; .set fp14,14; .set fp15,15
.set fp16,16; .set fp17,17; .set fp18,18; .set fp19,19; .set fp20,20; .set fp21,21; .set fp22,22; .set fp23,23
.set fp24,24; .set fp25,25; .set fp26,26; .set fp27,27; .set fp28,28; .set fp29,29; .set fp30,30; .set fp31,31
.set cr0,0; .set cr1,1; .set cr2,2; .set cr3,3; .set cr4,4; .set cr5,5; .set cr6,6; .set cr7,7
.set MQ,0; .set XER,1; .set FROM_RTCU,4; .set FROM_RTCL,5; .set FROM_DEC,6; .set LR,8; .set CTR,9; .set TID,17
.set DSISR,18; .set DAR,19; .set TO_RTCU,20; .set TO_RTCL,21; .set TO_DEC,22; .set SDR_0,24; .set SDR_1,25; .set SRR_0,26
.set SRR_1,27
.set BO_dCTR_NZERO_AND_NOT,0; .set BO_dCTR_NZERO_AND_NOT_1,1; .set BO_dCTR_ZERO_AND_NOT,2; .set BO_dCTR_ZERO_AND_NOT_1,3
.set BO_IF_NOT,4; .set BO_IF_NOT_1,5; .set BO_IF_NOT_2,6; .set BO_IF_NOT_3,7
.set BO_dCTR_NZERO_AND,8; .set BO_dCTR_NZERO_AND_1,9; .set BO_dCTR_ZERO_AND,10; .set BO_dCTR_ZERO_AND_1,11
.set BO_IF,12; .set BO_IF_1,13; .set BO_IF_2,14; .set BO_IF_3,15
.set BO_dCTR_NZERO,16; .set BO_dCTR_NZERO_1,17; .set BO_dCTR_ZERO,18; .set BO_dCTR_ZERO_1,19
.set BO_ALWAYS,20; .set BO_ALWAYS_1,21; .set BO_ALWAYS_2,22; .set BO_ALWAYS_3,23
.set BO_dCTR_NZERO_8,24; .set BO_dCTR_NZERO_9,25; .set BO_dCTR_ZERO_8,26; .set BO_dCTR_ZERO_9,27
.set BO_ALWAYS_8,28; .set BO_ALWAYS_9,29; .set BO_ALWAYS_10,30; .set BO_ALWAYS_11,31
.set CR0_LT,0; .set CR0_GT,1; .set CR0_EQ,2; .set CR0_SO,3
.set CR1_FX,4; .set CR1_FEX,5; .set CR1_VX,6; .set CR1_OX,7
.set CR2_LT,8; .set CR2_GT,9; .set CR2_EQ,10; .set CR2_SO,11
.set CR3_LT,12; .set CR3_GT,13; .set CR3_EQ,14; .set CR3_SO,15
.set CR4_LT,16; .set CR4_GT,17; .set CR4_EQ,18; .set CR4_SO,19
.set CR5_LT,20; .set CR5_GT,21; .set CR5_EQ,22; .set CR5_SO,23
.set CR6_LT,24; .set CR6_GT,25; .set CR6_EQ,26; .set CR6_SO,27
.set CR7_LT,28; .set CR7_GT,29; .set CR7_EQ,30; .set CR7_SO,31
#
# PTMF Equates
#
.set this_delta,0
.set vtbl_index,4
.set vptr_offset,8
#
# Public Data
#
.csect __ptmf_null{RO}
.globl __ptmf_null{RO}
.long 0, 0, 0
# __ptmf_test - test pointer-to-member-function for null
#
# R3 contains the PTMF. If it is null, we return 0; else we return 1.
#
.csect .__ptmf_test{PR}
.globl .__ptmf_test{PR}
lwz r5,this_delta(r3)
lwz r6,vtbl_index(r3)
lwz r7,vptr_offset(r3)
li r3,1
cmpi cr0,r5,0
cmpi cr6,r6,0
cmpi cr7,r7,0
bnelr cr0
bnelr cr6
bnelr cr7
li r3,0
blr
# __ptmf_cmpr - compare two pointer-to-member-functions
#
# R3 and R4 contain the PTMFs. If equal, we return 0; else we return 1.
#
.csect .__ptmf_cmpr{PR}
.globl .__ptmf_cmpr{PR}
lwz r5,this_delta(r3)
lwz r6,this_delta(r4)
lwz r7,vtbl_index(r3)
lwz r8,vtbl_index(r4)
lwz r9,vptr_offset(r3)
lwz r10,vptr_offset(r4)
li r3,1
cmp cr0,r5,r6
cmp cr6,r7,r8
cmp cr7,r9,r10
bnelr cr0
bnelr cr6
bnelr cr7
li r3,0
blr
# __ptmf_call - call pointer-to-member-function
#
# R12 contains the PTMF. R3 contains 'this'.
#
.csect .__ptmf_call{GL}
.globl .__ptmf_call{GL}
lwz r0,this_delta(r12)
lwz r11,vtbl_index(r12)
lwz r12,vptr_offset(r12) # function pointer if not virtual
cmpi cr0,r11,0
add r3,r3,r0 # adjust 'this'
blt cr0,L.1
lwzx r12,r3,12 # get vptr
add r12,r12,r11 # point to vtbl entry
lwz r0,4(r12) # get 'this' delta
lwz r12,0(r12) # get function pointer
add r3,r3,r0 # adjust 'this' again
L.1: lwz r0,0(r12)
stw RTOC,20(SP)
mtctr r0
lwz RTOC,4(r12)
bctr
# __ptmf_call4 - call pointer-to-member-function, 'this' in R4
#
# R12 contains the PTMF. R4 contains 'this'.
#
.csect .__ptmf_call4{GL}
.globl .__ptmf_call4{GL}
lwz r0,this_delta(r12)
lwz r11,vtbl_index(r12)
lwz r12,vptr_offset(r12) # function pointer if not virtual
cmpi cr0,r11,0
add r4,r4,r0 # adjust 'this'
blt cr0,L.2
lwzx r12,r4,12 # get vptr
add r12,r12,r11 # point to vtbl entry
lwz r0,4(r12) # get 'this' delta
lwz r12,0(r12) # get function pointer
add r4,r4,r0 # adjust 'this' again
L.2: lwz r0,0(r12)
stw RTOC,20(SP)
mtctr r0
lwz RTOC,4(r12)
bctr
# __ptmf_scall - call pointer-to-member-function
#
# This is used when we know the class tree uses single inheritance only.
# R12 contains the PTMF. R3 contains 'this'.
#
#
.csect .__ptmf_scall{GL}
.globl .__ptmf_scall{GL}
lwz r11,vtbl_index(r12)
lwz r12,vptr_offset(r12) # function pointer if not virtual
cmpi cr0,r11,0
blt cr0,L.3
lwzx r12,r3,12 # get vptr
lwzx r12,r12,r11 # get function pointer
L.3: lwz r0,0(r12)
stw RTOC,20(SP)
mtctr r0
lwz RTOC,4(r12)
bctr
# __ptmf_scall4 - call pointer-to-member-function
#
# This is used when we know the class tree uses single inheritance only.
# R12 contains the PTMF. R4 contains 'this'.
#
#
.csect .__ptmf_scall4{GL}
.globl .__ptmf_scall4{GL}
lwz r11,vtbl_index(r12)
lwz r12,vptr_offset(r12) # function pointer if not virtual
cmpi cr0,r11,0
blt cr0,L.4
lwzx r12,r4,12 # get vptr
lwzx r12,r12,r11 # get function pointer
L.4: lwz r0,0(r12)
stw RTOC,20(SP)
mtctr r0
lwz RTOC,4(r12)
bctr